home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 284_01 / monitor.c < prev    next >
Text File  |  1989-03-11  |  4KB  |  167 lines

  1. /* monitor.c - virtual environment manager */
  2.  
  3. #include <stdio.h>
  4. #include "compile.h"
  5. #include "config.h"
  6. #include "defs.h"
  7. #include "mon.h"
  8.  
  9. #define X        RegX(*rp)
  10. #define A        RegA(*rp)
  11. #define C        RegC(*rp)
  12. #define BC        RegBC(*rp)
  13. #define DE        RegDE(*rp)
  14. #define HL        RegHL(*rp)
  15.  
  16. #define Ag(n)        ( Mem[ DE + (n) ] )
  17. #define Addr(x)        ( ( WORD )( (x) - Mem ) )
  18.  
  19. #define WRALL        (0)
  20. #define WRDIR        (1)
  21. #define WRUAL        (2)
  22. #define WREAD        (3)
  23.  
  24. BYTE * dmaptr;
  25.  
  26. BOOL mflag = 0;        /* memory dump on abort: 0 for no, 1 for yes */
  27. BOOL fflag = 0;        /* alart on 'status flag conflict' */
  28.  
  29. char * bootfile;    /* boot image file for 8080 */
  30.  
  31. /* unknown code */
  32. XXX ( p )
  33.     BYTE * p;
  34. {
  35.     fputs( "Unknown opcode: ", stderr );
  36.     fputxx( Addr( p ), stderr );
  37.     fputs( ": ", stderr );
  38.     fputx( *p, stderr );
  39.     fputs( "\n", stderr );
  40.     if ( mflag ) coredump( CORE_SYS );
  41. }
  42.  
  43. #if INOUT
  44.  
  45. /* I/O simulation */
  46. i_in ( p, rp )
  47.     BYTE * p;
  48.     REGS * rp;
  49. {
  50.     if ( IoMap[ *p ] & CANINPUT ) {
  51.     A = x_in( *p );
  52.     return( 0 );
  53.     } else {
  54.     fputs( "Unknown IN operation: ", stderr );
  55.     fputxx( Addr(p) - 1, stderr );
  56.     fputs( ": DB ", stderr );
  57.     fputx( *p, stderr );
  58.     fputs( "\n", stderr );
  59.     if ( mflag ) coredump( CORE_SYS );
  60.     return( 1 );
  61.     }
  62. }
  63.  
  64. i_out ( p, rp )
  65.     BYTE *p;
  66.     REGS * rp;
  67. {
  68.     if ( IoMap[ *p ] & CANOUTPUT ) {
  69.     x_out( *p, A );
  70.     } else {
  71.     fputs( "Unknown OUT operation: ", stderr );
  72.     fputxx( Addr(p) - 1, stderr );
  73.     fputs( ": DB ", stderr );
  74.     fputx( *p, stderr );
  75.     fputs( "\n", stderr );
  76.     if ( mflag ) coredump( CORE_SYS );
  77.     }
  78. }
  79.  
  80. #endif
  81.  
  82. /* special escape for virtual BIOS */
  83. esc ( x, rp )
  84.     BYTE * x;
  85.     register REGS * rp;
  86. {
  87.     switch ( *x ) {
  88.     case 0x00: A = 0x00;                    break;
  89.     case 0x01: A = i_boot() ? 0xFF : 0x00;            break;
  90.     case 0x02: A = x_const() ? 0xFF : 0x00;            break;
  91.     case 0x03: A = x_conin() & 0x7F;                break;
  92.     case 0x04:       x_conot( C & 0x7F );                break;
  93.     case 0x05:       x_lstot( C & 0x7F );                break;
  94.     case 0x06:       x_auxot( C );                break;
  95.     case 0x07: A = x_auxin();                    break;
  96.     case 0x0C:       dmaptr = &Mem[ BC ];                break;
  97.     case 0x0D: A = x_rd( dmaptr, Ag(0), Ag(1), Ag(2), WREAD );    break;
  98.     case 0x0E: A = x_wr( dmaptr, Ag(0), Ag(1), Ag(2), C );    break;
  99.     case 0x0F: A = x_lstst() ? 0xFF : 0x00;            break;
  100.     default:
  101.     fputs( "Unknown ESC operation: ", stderr );
  102.     fputxx( Addr(x) - 2, stderr );
  103.     fputs( ": ED xx ", stderr );
  104.     fputx( *x, stderr );
  105.     fputs( "\n", stderr );
  106.     if ( mflag ) coredump( CORE_SYS );
  107.     return( 1 );
  108.     }
  109.     return( 0 );
  110. }
  111.  
  112. /* Boot strap procedure */
  113.  
  114. i_boot ()
  115. {
  116.     if ( loader( bootfile ) ) {
  117.     fputs( "Cannot load system image: ", stderr );
  118.     fputs( bootfile, stderr );
  119.     fputs( "\n", stderr );
  120.     return( 1 );
  121.     } else {
  122.     return( 0 );
  123.     }
  124. }
  125.  
  126. /* status flag conflict */
  127. i_flag ()
  128. {
  129.     if ( fflag ) {
  130.     fputs( "Alart: status flag conflict\n", stderr );
  131.     }
  132. }
  133.  
  134. /* default file name interface */
  135. char * i_sysdsk ()
  136. {
  137.     return( DISK_SYS );
  138. }
  139.  
  140. /* initialization ( includes virtual IPL procedure ) */
  141. i_init ( argc, argv )
  142.     int argc;
  143.     char * argv [];
  144. {
  145.     int n;
  146.  
  147.     bootfile = BOOT_SYS;
  148.  
  149.     for ( n = 1; n < argc; n++ ) {
  150.     if ( argv[ n ][ 0 ] == '-' ) {
  151.         switch ( argv[ n ][ 1 ] ) {
  152.         case 'm': mflag = 1; break;
  153.         case 'f': fflag = 1; break;
  154.         case 'b': bootfile = argv[ n + 1 ]; break;
  155.         }
  156.     }
  157.     }
  158.  
  159.     if ( i_boot() ) return( 1 );
  160.  
  161.     return( 0 );
  162. }
  163.  
  164. i_exit ()
  165. {
  166. }
  167.